package com.mrjy.common.redis;

import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Tuple;

import java.util.Set;

/**
 * 操作redis实例
 * @author Administrator
 *
 */
public class RedisPool {

	@Autowired
	private JedisPool jedisPool;

	
	public void set(String key, String value) {
		Jedis jedis = jedisPool.getResource();
		jedis.set(key, value);
		jedis.close();
	}

	public String get(String key) {
		Jedis jedis = jedisPool.getResource();
		String result = jedis.get(key);
		jedis.close();
		return result;
	}

	public void del(String key) {
		Jedis jedis = jedisPool.getResource();
		jedis.del(key);
		jedis.close();
	}

	/**
	 * 为给定 key 设置/更新生存时间
	 * @param key
	 * @param seconds
	 */
	public void expire(String key, Integer seconds) {
		Jedis jedis = jedisPool.getResource();
		jedis.expire(key, seconds);
		jedis.close();

	}

	/**
	 * 设置过期时间,单位秒
	 * @param key
	 * @param value
	 * @param seconds
	 */
	public void set(String key, String value, Integer seconds) {
		Jedis jedis = jedisPool.getResource();
		jedis.set(key, value);
		jedis.expire(key, seconds);
		jedis.close();
	}
	
	
	/**
	 * 将键的整数值递增1返回,若键不存在，则在执行操作之前将其设置为0, 再增1
	 * @param key
	 * @return
	 */
	public Long incr(String key) {
		Jedis jedis = jedisPool.getResource();
		Long count = jedis.incr(key);
		jedis.close();
		return count;
	}
	
	/**
	 * 返回有序集key中，指定区间内的成员。其中成员的位置按score值递减(从大到小)来排列。具有相同score值的成员按字典序的反序排列。
	 * 下标参数 start 和 stop 都以 0 为底，也就是说，以 0 表示有序集第一个成员，以 1 表示有序集第二个成员，以此类推。
		你也可以使用负数下标，以 -1 表示最后一个成员， -2 表示倒数第二个成员，以此类推。
		超出范围的下标并不会引起错误。
		比如说，当 start 的值比有序集的最大下标还要大，或是 start > stop 时， ZRANGE 命令只是简单地返回一个空列表。
		另一方面，假如 stop 参数的值比有序集的最大下标还要大，那么 Redis 将 stop 当作最大下标来处理。
		可以通过使用 WITHSCORES 选项，来让成员和它的 score 值一并返回，返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。
		客户端库可能会返回一些更复杂的数据类型，比如数组、元组等。
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public Object zrevrange(String key,long start,long end){
		Jedis jedis = jedisPool.getResource();
		 Set<Tuple> set = jedis.zrevrangeWithScores(key, start, end);
		 jedis.close();
		 return set;
	}
	
	/**
	 *  将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
		如果某个 member 已经是有序集的成员，那么更新这个 member 的 score 值，并通过重新插入这个 member 元素，来保证该 member 在正确的位置上。
		score 值可以是整数值或双精度浮点数。
		如果 key 不存在，则创建一个空的有序集并执行 ZADD 操作。
		当 key 存在但不是有序集类型时，返回一个错误。
	 * @param key
	 * @param score
	 * @param member
	 */
	public void zadd(String key,double score,String member){
		Jedis jedis = jedisPool.getResource();
		jedis.zadd(key, score, member);
		jedis.close();
	}
	
	/**
	 * 为有序集 key 的成员 member 的 score 值加上增量 increment 。
		可以通过传递一个负数值 increment ，让 score 减去相应的值，比如 ZINCRBY key -5 member ，就是让 member 的 score 值减去 5 。
		当 key 不存在，或 member 不是 key 的成员时， ZINCRBY key increment member 等同于 ZADD key increment member 。
		当 key 不是有序集类型时，返回一个错误。
		score 值可以是整数值或双精度浮点数。
	 * @param key
	 * @param score
	 * @param member
	 * @return 返回新的score
	 */
	public Double zincrby(String key,double score,String member){
		Jedis jedis = jedisPool.getResource();
		Double zincrby = jedis.zincrby(key, score, member);
		jedis.close();
		return zincrby;
	}
	
	/**
	 * 从有序集合存储在键删除指定成员。非现有成员被忽略。当键存在，并且不持有有序集合，则会返回错误。
	 * @param key
	 * @param members
	 * @return 返回成员来自有序集合(不包括非现有成员)被删除的数量。
	 */
	public Long zrem(String key,String...members){
		Jedis jedis = jedisPool.getResource();
		Long zrem = jedis.zrem(key, members);
		jedis.close();
		return zrem;
	}

}
